package demo09.MoreTemplateMethod.Abstract;

/**
 * 模板方法模式：在一个方法中定义一个算法的骨架，而将一些步骤延迟到子类中，
 *          模板方法可以使子类在不改变算法结构的情况下，重新定义算法中的某些步骤。
 *          
 * 模板方法和策略方法都封装算法，一个用组合，一个用算法。
 * 可以说工厂方法时模板方法的一种特殊版本。
 * */
public abstract class CaffeineBeverageWithHook {

	//这是一个模板方法》将算法定义成一组步骤。
public 	final void prepareRecipe() {//不希望子类覆盖的方法，避免子类改变算法顺序
		boilWater();
		brew();//抽象的由子类提供实现
		pourInCup();
		if (customerWantsCondiments()) {//使用钩子，有子类决定要不要
			addCondiments();
		}
	}
 
public	abstract void brew();//抽象的由子类提供实现
 
public	abstract void addCondiments();//客户想要的调味品
 
public	void boilWater() {
		System.out.println("把水煮到沸腾");
	}
 
public	void pourInCup() {
		System.out.println("倒入杯子");
	}
 
public	boolean customerWantsCondiments() {//客户想要的调味品 
		return true;
	}
}
